1. StringIO
- 很多时候,数据读写不一定是文件,也可以在内存中读写
- StringIO 的作用: 在内存中对字符串进行读写操作
- 注意:
- 写入的数据必须是字符串类型的数据
- 通过 StringIO 所生成的内存对象都可以使用文件操作中的一些方法如: .read() .seek(num) .readline() ……
- .getvalue() 和 .read()的区别:
- .getvalue() -> 读取内存中的所有内容
- .read() -> 读取光标所在位置后面的内容,有时候使用.read()方法读取内存中内容返回的则是一个空,是因为通过.write()方法将字符串写入内存后,此时的光标是停留在最后面的,所以获取到的内容是空,解决办法: 先执行 .seek(num) 修改光标位置的方法,然后再调用 .read() 方法
- 导入 StringIO
from io import StringIO
- 写法一
from io import StringIO
f = StringIO() # 生成一个内存对象,相当于文件句柄
f.write('中文') # 将字符串内容写入内存中,每一次写入都会覆盖掉上一次的内容
f_content = f.getvalue() # 读取内存中所写入的所有内容
print(f_content) # 中文
- 写法二
from io import StringIO
f = StringIO('中文') # 直接生成一个有内容的内存对象,相当于给了一个默认值
f_content = f.getvalue() # 读取内存中的所有内容
f_content = f.read() # 读取光标所在位置后面的内容,因为是直接生成一个有内容的内存对象,此时的光标在第一位,所以可以获取到内存中的全部内容
print(f_content) # 中文
2. BytesIO
- 很多时候,数据读写不一定是文件,也可以在内存中读写
- BytesIO 的作用: 在内存中对二进制数据(即: bytes类型的数据)进行读写操作,相当于文件操作的中 rb 和 wb 操作
- 注意:
- 写入的数据必须是bytes类型的数据
- 通过 BytesIO 所生成的内存对象都可以使用文件操作中的一些方法如: .read() .seek(num) .readline() ……
- .getvalue() 和 .read()的区别:
- .getvalue() -> 读取内存中的所有内容
- .read() -> 读取光标所在位置后面的内容,有时候使用.read()方法读取内存中内容返回的则是一个空,是因为通过.write()方法将字符串写入内存后,此时的光标是停留在最后面的,所以获取到的内容是空,解决办法: 先执行 .seek(num) 修改光标位置的方法,然后再调用 .read() 方法
- 导入 BytesIO
from io import BytesIO
- 写法一
from io import BytesIO
f = BytesIO() # 生成一个内存对象,相当于文件句柄
f.write('中文'.encode('utf-8')) # 将bytes类型的数据写入内存中,每一次写入都会覆盖掉上一次的内容
f_content = f.getvalue() # 读取内存中所写入的所有内容
print(f_content) # b'\xe4\xb8\xad\xe6\x96\x87'
print(f_content.decode('utf-8')) # 中文
- 写法二
from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') # 直接生成一个有内容的内存对象,相当于给了一个默认值
f_content = f.getvalue() # 读取内存中的所有内容
f_content = f.read() # 读取光标所在位置后面的内容,因为是直接生成一个有内容的内存对象,此时的光标在第一位,所以可以获取到内存中的全部内容
print(f_content) # b'\xe4\xb8\xad\xe6\x96\x87'
print(f_content.decode('utf-8')) # 中文